home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / MODEM.PAS < prev    next >
Pascal/Delphi Source File  |  1996-12-10  |  11KB  |  402 lines

  1. UNIT Modem;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Misc. modem functions                         Last changed: 10.12.96  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-96 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32;
  16.  
  17. PROCEDURE MakeModemBusy;
  18. FUNCTION  CheckConnectExit(CONST s: String): Byte;
  19. PROCEDURE InitModemForEvent;
  20. PROCEDURE MNPFilter;
  21. FUNCTION  CheckBiOverride(CONST InStr: String): Boolean;
  22. FUNCTION  ModemReadStr: String;
  23. PROCEDURE ModemHangUp;
  24. PROCEDURE InitModem(BaudRate: Word; CONST Preinit, Init: String);
  25. PROCEDURE TranslateModemString(CONST St: String);
  26. FUNCTION  TimedRead(Time: LongInt): Integer;
  27. PROCEDURE WaitForSlowModem;
  28. FUNCTION  GetRealBaudRate(s: String): Word;
  29. FUNCTION  GetExtraInfo(CONST s: String): String;
  30. FUNCTION  IsLockedBaud(CONST s: String): Boolean;
  31. PROCEDURE DropCarrier;
  32. PROCEDURE LogLinkStat;
  33.  
  34. IMPLEMENTATION
  35.  
  36. USES OpCrt, OpWindow, OpString, ApTimer,
  37.      MTask, PoPTypes, Com, Util, Display, LogFile, Globals,
  38.      OProUtil, Keyboard;
  39.  
  40.   PROCEDURE MakeModemBusy;
  41.   BEGIN
  42.     IF Cfg.Modem.Busy<>'' THEN
  43.     BEGIN
  44.       TranslateModemString('^'+Cfg.Modem.Busy);
  45.       Pause(50);
  46.       WHILE ComPort^.KeyPressed DO
  47.         ComPort^.PurgeIn;
  48.       NewTimer(ModemReInit, 0);
  49.     END;
  50.   END;
  51.  
  52.   FUNCTION CheckConnectExit(CONST s: String): Byte;
  53.   VAR
  54.     el,i : Byte;
  55.   BEGIN
  56.     el:=0;
  57.     FOR i:=1 TO 5 DO
  58.       IF (Cfg.Modem.ExitStr[i].ConStr<>'') And (Pos(Cfg.Modem.ExitStr[i].ConStr,s)>0)THEN
  59.         el:=Cfg.Modem.ExitStr[i].ErrLvl;
  60.     CheckConnectExit:=el;
  61.   END;
  62.  
  63.   PROCEDURE InitModemForEvent;
  64.   BEGIN
  65.     IF (CurrentEvent.Typ AND etNoAnswer=etNoAnswer) AND (Cfg.Modem.NoAnswer<>'') THEN
  66.       InitModem(Cfg.Modem.BaudRate,Cfg.Modem.PreInit,Cfg.Modem.NoAnswer)
  67.     ELSE
  68.       InitModem(Cfg.Modem.BaudRate,Cfg.Modem.PreInit,Cfg.Modem.Init);
  69.     NewTimerSecs(ModemReInit, Cfg.Modem.ReInit);
  70.   END;
  71.  
  72.   PROCEDURE MNPFilter;
  73.   CONST
  74.     BadChars = #17#22+'b'+#252#253#254#255;
  75.   VAR
  76.     t,t1 : EventTimer;
  77.     c : Byte;
  78.   BEGIN
  79.     NewTimerSecs(t1, 10);
  80.     NewTimerSecs(t, 1);
  81.     WHILE Not TimerExpired(t) DO
  82.     BEGIN
  83.       IF TimerExpired(t1) THEN Exit;
  84.       IF ComPort^.Peek(c) THEN
  85.       BEGIN
  86.         IF ((c<>0) And (Pos(Char(c),BadChars)>0)) Or (Pos(Char(c And $7f),BadChars)>0) THEN
  87.         BEGIN
  88.           c:=ComPort^.ReadByte;
  89.           AddLog(' ','MNP Filter');
  90.           NewTimer(t, 9);
  91.           WHILE Not TimerExpired(t) DO
  92.           BEGIN
  93.             IF ComPort^.KeyPressed THEN
  94.             BEGIN
  95.               c:=ComPort^.ReadByte;
  96.               NewTimer(t, 9);
  97.             END;
  98.             IF TimerExpired(t1) THEN Exit;
  99.           END;
  100.         END;
  101.       END;
  102.     END;
  103.   END;
  104.  
  105.   FUNCTION GetRealBaudRate(s: String): Word;
  106.   VAR
  107.     Error: Integer;
  108.     R    : Word;
  109.   BEGIN
  110.     s:=Copy(s,9,255);
  111.     IF pos('/', s)>0 THEN s:=Copy(s, 1, pos('/',s) - 1);
  112.     IF pos(' ', s)>0 THEN s:=Copy(s, 1, pos(' ',s) - 1);
  113.     WHILE (s<>'') AND (Pos(s[Length(s)],'0123456789')=0) DO
  114.       Dec(s[0]) ;
  115.     IF s<>'' THEN Val(s,r,Error) ELSE r:=300;
  116.     IF r<300 THEN r:=300;
  117.     GetRealBaudRate:=r;
  118.   END;
  119.  
  120.   FUNCTION GetExtraInfo(CONST s: String): String;
  121.   VAR
  122.     i : Byte;
  123.   BEGIN
  124.     i:=9;
  125.     WHILE (i<Length(s)) AND (Pos(s[i],'0123456789')>0) DO
  126.       Inc(i);
  127.     GetExtraInfo:=Copy(s,i+1,255);
  128.   END;
  129.  
  130.   PROCEDURE WaitForSlowModem;
  131.   VAR
  132.     x : EventTimer;
  133.   BEGIN
  134.     NewTimerSecs(x, 2);
  135.     WHILE NOT ComPort^.Carrier AND NOT TimerExpired(x) DO
  136.       GiveUpTime;
  137.   END;
  138.  
  139.   FUNCTION CheckBiOverride(CONST InStr: String): Boolean;
  140.   VAR
  141.     i : Byte;
  142.     c : Boolean;
  143.   BEGIN
  144.     IF ComPort^.GetBaudRate<=Cfg.BiMail.MaxBaud THEN
  145.       c:=True
  146.     ELSE
  147.     BEGIN
  148.       C:=False;
  149.       FOR i:=1 TO 5 DO
  150.         IF (Cfg.Bimail.BiOverride[i]<>'') And (Pos(StUpCase(Cfg.BiMail.BiOverride[i]),StUpCase(InStr))>0) THEN C:=True;
  151.     END;
  152.     CheckBiOverride:=c;
  153.   END;
  154.  
  155.   FUNCTION IsLockedBaud(CONST s: String): Boolean;
  156.   BEGIN
  157.     IsLockedBaud:=(Cfg.Modem.LockedBaud<>'') And (Pos(Cfg.Modem.LockedBaud,s)>0);
  158.   END;
  159.  
  160.   FUNCTION TimedRead(Time: LongInt): Integer;
  161.   VAR
  162.     t       : EventTimer;
  163.     OutByte : Integer;
  164.   BEGIN
  165.     OutByte:=-1;
  166.     NewTimer(t, Secs2Tics(Time) DIV 100);
  167.     WHILE (NOT ComPort^.KeyPressed) AND (NOT TimerExpired(t)) AND (ComPort^.Carrier) DO
  168. {     GiveUpTime};
  169.     IF (ComPort^.KeyPressed) AND (ComPort^.Carrier) THEN OutByte:=ComPort^.ReadByte;
  170.     TimedRead:=OutByte;
  171.   END;
  172.  
  173.   PROCEDURE EmptyDelay;
  174.   VAR
  175.     t : EventTimer;
  176.   BEGIN
  177.     NewTimerSecs(t, 5);
  178.     WHILE (NOT TimerExpired(t)) AND (NOT ComPort^.OutEmpty) DO
  179.       IF MultiTasker=1 THEN GiveUpTime;
  180.   END;
  181.  
  182.   FUNCTION ModemReadStr : String;
  183.   VAR
  184.     InStr   : String;
  185.     Count   : Byte;
  186.     t       : EventTimer;
  187.     Ch      : Char;
  188.     Escaped : Boolean;
  189.   BEGIN
  190.     InStr:=''; Count:=0; Ch:=#0;
  191.     NewTimerSecs(t, 2);
  192.     Escaped:=GotESC;
  193.     WHILE (Count<81) AND (NOT TimerExpired(t)) AND (NOT Escaped) DO
  194.     BEGIN
  195.       IF ComPort^.KeyPressed THEN
  196.       BEGIN
  197.         Ch:=Char(ComPort^.ReadByte);
  198.         IF (Ch=Char(Cr)) OR (Ch=Char(Lf)) THEN
  199.         BEGIN
  200.           IF Count>0 THEN Count:=81;
  201.         END ELSE
  202.         BEGIN
  203.           InStr:=InStr+Ch;
  204.           Inc(Count);
  205.         END;
  206.         NewTimerSecs(t, 2);
  207.       END;{ ELSE
  208.         GiveUpTime;}
  209.       Escaped:=GotESC;
  210.     END;
  211.     IF NOT Escaped THEN ModemReadStr:=InStr ELSE ModemReadStr:='';
  212.   END;
  213.  
  214.   PROCEDURE TranslateModemString(CONST St : String);
  215.   VAR
  216.     a : Byte;
  217.     Escaped : Boolean;
  218.   BEGIN
  219.     Escaped:=False;
  220.     FOR a:=1 TO Length(St) DO
  221.     BEGIN
  222.       IF Escaped THEN
  223.       BEGIN
  224.         ComPort^.WriteByte(Byte(St[a]), False);
  225.         Escaped:=False;
  226.       END ELSE
  227.       BEGIN
  228.         CASE St[a] OF
  229.           '\' : Escaped:=True;
  230.           '-' : ;
  231.           '^' : BEGIN
  232.                   EmptyDelay;
  233.                   ComPort^.SetDtr(High);
  234.                 END;
  235.           'v' : BEGIN
  236.                   EmptyDelay;
  237.                   ComPort^.SetDtr(Low);
  238.                 END;
  239.           '|' : BEGIN
  240.                   ComPort^.WriteByte(Byte(Cr), True);
  241.                   EmptyDelay;
  242.                   Pause(20);
  243.                 END;
  244.           '`' : BEGIN
  245.                   Pause(10);
  246.                 END;
  247.           '~' : BEGIN
  248.                   EmptyDelay;
  249.                   Pause(100);
  250.                 END;
  251.           ELSE  BEGIN
  252.                   ComPort^.WriteByte(Byte(St[a]), False);
  253.     {             Pause(1);}
  254.                 END;
  255.         END;
  256.       END;
  257.     END;
  258.   END;
  259.  
  260.   PROCEDURE InitModem(BaudRate : Word; CONST preinit, Init : String);
  261.   VAR
  262.     i  : Byte;
  263.     s  : String;
  264.     t  : EventTimer;
  265.   BEGIN
  266.     IF ((CmdLineFlags AND clNoModem)=0) AND NOT PoPKeyPressed THEN
  267.     BEGIN
  268.       ComPort^.SetXOn(Off);
  269.       i:=0;
  270.       REPEAT
  271.         Inc(i);
  272.         ComPort^.PurgeOut; ComPort^.PurgeIn;
  273.         ComPort^.SetDtr(High);
  274.         ComPort^.SetBaudRate(BaudRate);
  275.         IF PreInit<>'' THEN
  276.         BEGIN
  277.           ComPort^.WriteStr(' '+CHAR(Cr));
  278.           TranslateModemString(PreInit);
  279.           ComPort^.PurgeIn;
  280.           Pause(10);
  281.         END ELSE
  282.         BEGIN
  283.           ComPort^.WriteByte(Byte(Cr), True);
  284.           ComPort^.SetDtr(Low);
  285.           Pause(100);
  286.           ComPort^.SetDtr(High);
  287.           Pause(50);
  288.           ComPort^.WriteStr(' '+Char(Cr));
  289.           Pause(50);
  290.           ComPort^.PurgeIn;
  291.         END;
  292.         IF ComPort^.Carrier THEN
  293.         BEGIN
  294.           ComPort^.SetFlowControl(0);
  295.           ComPort^.SetDtr(On);
  296.           ComPort^.WriteByte(17, True);
  297.           ComPort^.SendBreak;
  298.           DropCarrier;
  299.           ComPort^.SetFlowControl(2);
  300.           ComPort^.PurgeIn;
  301.         END;
  302.         TranslateModemString(Init);
  303.         s:=''; NewTimerSecs(t, 5);
  304.         WHILE (Not TimerExpired(t)) And (s<>'OK') DO
  305.         BEGIN
  306.           IF (GotESC) And (i>1) THEN Halt(1);
  307.           s:=ModemReadStr;
  308. {
  309.           IF FKeyPressed THEN s:=s+Char(FReadByte);
  310.           IF (Length(s)=1) AND (s[1]<>'O') THEN s:='';
  311.           IF (Length(s)=2) AND (s[2]<>'K') THEN s:='';
  312. }
  313.         END;
  314.         IF s<>'OK' THEN AddLog('!','Modem does not respond OK');
  315.       UNTIL (s='OK') OR (i=4);
  316.       IF i=4 THEN
  317.       BEGIN
  318.         AddLog('!','Error initializing modem - aborting');
  319.         SpawnWithErrorlevel(253, 'Exiting', False);
  320.       END;
  321.       Pause(50);
  322.       ComPort^.PurgeIn; ComPort^.PurgeOut;
  323.       UpdateStatusWindow;
  324.     END;
  325.   END;
  326.  
  327.   PROCEDURE ModemHangUp;
  328.   BEGIN
  329.     IF Cfg.Modem.Hangup<>'' THEN TranslateModemString(Cfg.Modem.Hangup);
  330.     IF ComPort^.Carrier THEN DropCarrier;
  331.     ComPort^.PurgeOut;
  332.     ComPort^.PurgeIn;
  333.   END;
  334.  
  335.   PROCEDURE DropCarrier;
  336.   VAR
  337.     t : EventTimer;
  338.     Wait : PWait;
  339.   BEGIN
  340.     New(Wait, Init((ScreenHeight DIV 2)-3, 2, 'Waiting for modem to drop carrier'));
  341.     ComPort^.SetDtr(Low);
  342.     NewTimerSecs(t, 10);
  343.     WHILE ComPort^.Carrier AND Not TimerExpired(t) DO
  344.     BEGIN
  345.       GiveUpTime;
  346.       Wait^.Animate;
  347.     END;
  348.     IF ComPort^.Carrier THEN TranslateModemString('^~~~+++~~~ATH0|');
  349.     Dispose(Wait, Done);
  350.   END;
  351.  
  352.   PROCEDURE LogLinkStat;
  353.   VAR
  354.     t : EventTimer;
  355.     Ch : Char;
  356.     InStr : S200;
  357.     Lines : Byte;
  358.   BEGIN
  359.     IF (Cfg.Modem.LinkStat<>'') AND (Cfg.Modem.LogLines>0) THEN
  360.     BEGIN
  361.       IF ComPort^.Carrier THEN
  362.       BEGIN
  363.         DropCarrier;
  364.         NewTimerSecs(t, 10);
  365.         WHILE ComPort^.Carrier AND Not TimerExpired(t) DO
  366.           GiveUpTime;
  367.       END;
  368.       ComPort^.SetDtr(High);
  369.       NewTimerSecs(t,1);
  370.       WHILE Not TimerExpired(t) OR ComPort^.KeyPressed DO
  371.       BEGIN
  372.         ComPort^.PurgeIn;
  373.         GiveUpTime;
  374.       END;
  375.       ComPort^.PurgeOut;
  376.       TranslateModemString(Cfg.Modem.LinkStat);
  377.       AddLog('!', 'Getting link statistics...');
  378.       NewTimerSecs(t, 30);
  379.       Lines:=0; InStr:='';
  380.       REPEAT
  381.         IF ComPort^.Keypressed THEN
  382.         BEGIN
  383.           Ch:=Char(ComPort^.ReadByte);
  384.           IF Ch=#13 THEN
  385.           BEGIN
  386.             IF (Copy(InStr,1,2)<>'AT') AND ((InStr<>'') OR (Lines>0)) THEN
  387.             BEGIN
  388.               AddLog('!',InStr);
  389.               Inc(Lines);
  390.             END;
  391.             InStr:='';
  392.           END ELSE
  393.             IF Ch<>#10 THEN InStr:=InStr+Ch;
  394.         END;
  395.       UNTIL (Lines=Cfg.Modem.LogLines) OR TimerExpired(t);
  396.       ComPort^.PurgeIn;
  397.     END;
  398.   END;
  399.  
  400. END.
  401.  
  402.